package main

import "fmt"

type Rect struct {
	width, height int
}

/*
   有两个原因需要使用指针接收者。
   首先避免在每个方法调用中拷贝值（如果值类型是大的结构体的话会更有效率）。
   其次，方法可以修改接收者指向的值。
*/

func (rect *Rect) Aare() {
	fmt.Printf("rect are is %d\n", rect.width*rect.height)
}

//在结构指针类型上可以修改接受者所指向的值
func (rect *Rect) FixWidth(width int) {
	rect.width = width
}

//
func (rect *Rect) FixHeight(height int) {
	rect.height = height
}

//
func (rect *Rect) ShowInfo() {
	fmt.Printf("Rect is Width=%d Height=%d\n", rect.width, rect.height)
}

func main() {
	//var rect Rect //第一个变量，成员将被初始化为0
	//rect := Rect{10, 5}
	//var rect = Rect{height: 30, width: 9} //指定成员初始化
	//var rect = Rect{}
	//var rect = Rect{4} //Rect{4,} Rect{,}错误
	//var rect = Rect{height: 4}
	//rect := new(Rect) //分配一个内存空间，成员值被初始化为0，并且返回它的指针（*Rect）
	rect := &Rect{8, 9}
	rect.width = 9 //小写在本包里还是可以访问的
	rect.ShowInfo()
	rect.Aare()
	rect.FixHeight(3)
	rect.FixWidth(6)
	rect.ShowInfo()
	rect.Aare()
}
